package com.itany.shop.service.impl;

import com.itany.shop.dao.ProductDao;
import com.itany.shop.entity.Item;
import com.itany.shop.entity.Product;
import com.itany.shop.exception.LoginDisabledException;
import com.itany.shop.exception.RequestParameterErrorException;
import com.itany.shop.factory.ObjectFactory;
import com.itany.shop.service.CartService;
import com.itany.shop.util.ParameterUtil;
import com.itany.shop.vo.Cart;

import java.util.List;

/**
 * @Author:石小俊
 * @Date:2022/12/16 11:29
 * @Version:1.0-SNAPSHOT
 * @Description:
 */
public class CartServiceImpl implements CartService {

    private ProductDao productDao = (ProductDao) ObjectFactory.getObject("productDao");

    @Override
    public void addCart(Cart cart, String id) throws LoginDisabledException, RequestParameterErrorException {
        if(null == cart){
            throw new LoginDisabledException("登录失效");
        }
        if(ParameterUtil.isNull(id)){
            throw new RequestParameterErrorException("请求参数有误");
        }
        // 查询商品的最新信息
        Product product = productDao.selectById(Integer.parseInt(id));

        // 加入购物车存在两种
        // 1.当前购物车中已经存在该商品
        // 取出当前购物车中所有明细信息
        List<Item> items = cart.getItems();
        // 遍历这些明细
        for(Item item : items){
            // 找到已经存在的商品
            // 明细中的商品编号与当前商品编号一致,表示存在
            if(product.getId().equals(item.getProduct().getId())){
                // 此时购物车发生了哪些变化
                // 1.明细数量+1
                item.setNum(item.getNum()+1);
                // 在修改明细总价之前的总价为原来的明细总价
                Double oldPrice = item.getPrice();
                // 2.明细总价=当前商品单价*当前明细数量
                item.setPrice(product.getPrice()*item.getNum());
                // 在修改明细总价之后的总价为现在的明细总价
                Double newPrice = item.getPrice();
                // 3.购物车总价=原来的购物车总价-原来的明细总价+现在的明细总价
                cart.setPrice(cart.getPrice()-oldPrice+newPrice);
                return;
            }
        }


        // 2.当前购物车中尚未存在该商品
        // 购物车发生哪些变化
        // 1.新增了一条明细信息
        Item item = new Item();
        // 该明细的商品即为当前商品
        item.setProduct(product);
        // 该明细的数量=1
        item.setNum(1);
        // 该明细的总价=商品单价
        item.setPrice(product.getPrice());
        // 加入到购物车中
        cart.addItem(item);
        // 2.购物车总价=原来的购物车总价+当前明细总价
        cart.setPrice(cart.getPrice()+item.getPrice());
    }

    @Override
    public void modifyCart(Cart cart, String id, String num) throws LoginDisabledException, RequestParameterErrorException {
        if(null == cart){
            throw new LoginDisabledException("请先登录");
        }
        if(ParameterUtil.isNull(id) || ParameterUtil.isNull(num)){
            throw new RequestParameterErrorException("请求参数有误");
        }

        // 查询指定商品的最新信息
        Product product = productDao.selectById(Integer.parseInt(id));
        // 修改购物车中指定明细的数量
        // 取出购物车中所有的明细
        List<Item> items = cart.getItems();
        for(Item item : items){
            // 找到需要修改的明细是谁
            if(item.getProduct().getId().equals(product.getId())){
                // 购物车发生了哪些变化
                // 1.明细的数量=num
                item.setNum(Integer.parseInt(num));
                // 由于明细的数量发生了变化,会导致与之相关的数据随之变化
                // 获取原来的明细总价
                Double oldPrice = item.getPrice();
                // 2.明细的总价=当前商品单价*当前明细的数量
                item.setPrice(product.getPrice()*item.getNum());
                // 获取现在的明细总价
                Double newPrice = item.getPrice();
                // 3.购物车总价=原来的购物车总价-原来的明细总价+现在的明细总价
                cart.setPrice(cart.getPrice()-oldPrice+newPrice);
            }
        }
    }

    @Override
    public void removeCart(Cart cart, String id) throws LoginDisabledException, RequestParameterErrorException {
        if(null == cart){
            throw new LoginDisabledException("请先登录");
        }
        if(ParameterUtil.isNull(id)){
            throw new RequestParameterErrorException("请求参数有误");
        }

        // 找到需要删除的明细是哪一个
        List<Item> items = cart.getItems();
        // 由于删除元素会改变集合,因此,此处不能使用foreach遍历
        for(int i = 0; i < items.size(); i++){
            // 取出当前迭代的元素
            Item item = items.get(i);
            // 判断该元素是否是需要被删除的元素
            if(item.getProduct().getId().equals(Integer.parseInt(id))){
                // 该元素即为需要删除的明细
                // 明细被删除后,购物车发生哪些变化?
                // 1.购物车总价=原来的购物车总价-原来的明细总价
                cart.setPrice(cart.getPrice()-item.getPrice());
                // 2.移除对应的明细信息
                cart.removeItem(item);
            }
        }
    }
}
